<?php

namespace Database\Seeders;

use App\Models\Bar;
use App\Models\BarMember;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class BarSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // 获取所有用户
        $users = User::all();
        
        if ($users->isEmpty()) {
            $this->command->warn('没有用户数据，请先运行 UserSeeder');
            return;
        }

        // 定义真实的贴吧数据
        $realBars = [
            // 技术类贴吧
            [
                'name' => '前端开发',
                'description' => '讨论前端技术、框架和最佳实践，分享开发经验',
                'category' => '技术',
            ],
            [
                'name' => 'Laravel框架',
                'description' => 'Laravel PHP 框架学习交流，分享开发技巧和经验',
                'category' => '技术',
            ],
            [
                'name' => 'Python编程',
                'description' => 'Python 编程学习交流，从入门到精通',
                'category' => '技术',
            ],
            [
                'name' => 'JavaScript',
                'description' => 'JavaScript 技术讨论，ES6+、Node.js 等',
                'category' => '技术',
            ],
            [
                'name' => '算法学习',
                'description' => '算法与数据结构学习，刷题经验分享',
                'category' => '技术',
            ],
            
            // 设计类贴吧
            [
                'name' => 'UI设计',
                'description' => '用户界面设计交流，设计作品分享和点评',
                'category' => '设计',
            ],
            [
                'name' => '摄影技巧',
                'description' => '摄影技术交流，作品分享，设备讨论',
                'category' => '设计',
            ],
            [
                'name' => '产品设计',
                'description' => '产品设计思路和方法，用户体验优化',
                'category' => '设计',
            ],
            
            // 生活类贴吧
            [
                'name' => '美食分享',
                'description' => '分享美食制作方法，探店打卡，菜谱交流',
                'category' => '生活',
            ],
            [
                'name' => '旅行攻略',
                'description' => '旅行经验分享，攻略交流，美景打卡',
                'category' => '生活',
            ],
            [
                'name' => '健身运动',
                'description' => '健身经验交流，运动打卡，健康生活',
                'category' => '生活',
            ],
            [
                'name' => '读书交流',
                'description' => '好书推荐，读书心得分享，书友交流',
                'category' => '生活',
            ],
            [
                'name' => '宠物交流',
                'description' => '宠物饲养经验，萌宠日常分享',
                'category' => '生活',
            ],
            
            // 学习类贴吧
            [
                'name' => '编程学习',
                'description' => '编程入门指导，学习路线分享，经验交流',
                'category' => '学习',
            ],
            [
                'name' => '英语学习',
                'description' => '英语学习方法和资源分享，口语练习',
                'category' => '学习',
            ],
            
            // 兴趣类贴吧
            [
                'name' => '二次元',
                'description' => '动漫、游戏、Cosplay 等二次元文化讨论',
                'category' => '兴趣',
            ],
            [
                'name' => '影视剧评',
                'description' => '电影、电视剧推荐和讨论，剧情分析',
                'category' => '兴趣',
            ],
            [
                'name' => '游戏讨论',
                'description' => '游戏攻略分享，游戏心得交流',
                'category' => '兴趣',
            ],
        ];

        $this->command->info('开始创建贴吧数据...');

        // 创建真实贴吧
        foreach ($realBars as $index => $barData) {
            $owner = $users->random();
            
            // 生成唯一的 slug（中文字符会被移除，添加索引确保唯一）
            $baseSlug = \Illuminate\Support\Str::slug($barData['name']);
            $slug = $baseSlug ?: 'bar-' . ($index + 1);
            
            // 如果 slug 已存在，添加随机数
            while (Bar::where('slug', $slug)->exists()) {
                $slug = $baseSlug . '-' . fake()->randomNumber(3, true);
            }
            
            $bar = Bar::create([
                'name' => $barData['name'],
                'slug' => $slug,
                'description' => $barData['description'],
                'owner_id' => $owner->id,
                'member_count' => 1, // 吧主是第一个成员
                'post_count' => 0,
            ]);

            // 创建吧主成员记录
            BarMember::create([
                'bar_id' => $bar->id,
                'user_id' => $owner->id,
                'role' => 'owner',
                'joined_at' => now()->subDays(fake()->numberBetween(1, 365)),
            ]);

            // 随机让一些用户加入贴吧（不包括吧主）
            // 真实贴吧成员数更真实：大部分 3-8 人，少数 10-15 人
            $availableUsers = $users->where('id', '!=', $owner->id);
            $maxJoin = fake()->boolean(70) 
                ? fake()->numberBetween(3, 8)  // 70% 概率：3-8 人
                : fake()->numberBetween(10, min(15, $availableUsers->count())); // 30% 概率：10-15 人
            $joinCount = min($maxJoin, $availableUsers->count());
            $otherUsers = $availableUsers->random($joinCount);
            $memberCount = 1; // 包含吧主

            foreach ($otherUsers as $user) {
                BarMember::create([
                    'bar_id' => $bar->id,
                    'user_id' => $user->id,
                    'role' => 'member',
                    'joined_at' => now()->subDays(fake()->numberBetween(1, 180)),
                ]);
                $memberCount++;
            }

            // 更新成员数
            $bar->update(['member_count' => $memberCount]);
        }

        // 创建一些随机贴吧（使用 Factory）
        // 为每个贴吧指定一个随机用户作为吧主
        $randomBars = collect();
        $existingBarNames = Bar::pluck('name')->toArray(); // 获取已存在的贴吧名称
        
        for ($i = 0; $i < 5; $i++) {
            $owner = $users->random();
            
            // 创建贴吧，确保名称不重复
            $attempts = 0;
            do {
                $barData = Bar::factory()->make([
                    'owner_id' => $owner->id,
                ])->toArray();
                
                // 如果名称重复，添加随机后缀
                if (in_array($barData['name'], $existingBarNames)) {
                    $barData['name'] = $barData['name'] . ' ' . fake()->randomNumber(3, true);
                }
                
                // 确保 slug 唯一
                $originalSlug = $barData['slug'];
                $counter = 1;
                while (Bar::where('slug', $barData['slug'])->exists()) {
                    $barData['slug'] = $originalSlug . '-' . $counter;
                    $counter++;
                }
                
                $attempts++;
            } while (Bar::where('name', $barData['name'])->exists() && $attempts < 10);
            
            // 如果仍然重复，强制使用唯一名称
            if (Bar::where('name', $barData['name'])->exists()) {
                $barData['name'] = '贴吧' . time() . '-' . fake()->randomNumber(4, true);
                $barData['slug'] = 'bar-' . time() . '-' . fake()->randomNumber(4, true);
            }
            
            $bar = Bar::create($barData);
            $existingBarNames[] = $bar->name; // 添加到已存在列表
            $randomBars->push($bar);
        }

        foreach ($randomBars as $bar) {
            // 创建吧主成员记录
            BarMember::create([
                'bar_id' => $bar->id,
                'user_id' => $bar->owner_id,
                'role' => 'owner',
                'joined_at' => $bar->created_at,
            ]);

            // 随机让一些用户加入（热门贴吧成员更多）
            // 随机贴吧的成员分布：大部分 5-20 人，热门贴吧 30-全部用户
            $isPopular = fake()->boolean(20); // 20% 概率是热门贴吧
            $availableUsers = $users->where('id', '!=', $bar->owner_id);
            
            if ($isPopular) {
                // 热门贴吧：加入更多成员（最多所有可用用户）
                $memberCount = fake()->numberBetween(8, min(12, $availableUsers->count() + 1));
            } else {
                // 普通贴吧：3-8 人
                $memberCount = fake()->numberBetween(3, min(8, $availableUsers->count() + 1));
            }
            
            $joinCount = min($memberCount - 1, $availableUsers->count());
            $otherUsers = $availableUsers->random($joinCount);

            foreach ($otherUsers as $user) {
                BarMember::create([
                    'bar_id' => $bar->id,
                    'user_id' => $user->id,
                    'role' => 'member',
                    'joined_at' => fake()->dateTimeBetween($bar->created_at, 'now'),
                ]);
            }

            // 更新统计信息
            $bar->update([
                'member_count' => $memberCount,
                'post_count' => fake()->numberBetween(0, $memberCount * 2),
            ]);
        }

        $this->command->info('贴吧数据填充完成！');
        $this->command->info('共创建 ' . (count($realBars) + $randomBars->count()) . ' 个贴吧');
    }
}
